perm filename GEMOLD.DOC[DOC,BGB] blob
sn#019099 filedate 1973-06-15 generic text, type T, neo UTF8
00100 SAILON NUMBER 68 GEOMED MANUAL
00200
00300
00400 STANFORD ARTIFICIAL INTELLIGENCE LABORATORY MAY 1972
00500 OPERATING NOTE NUMBER 68
00600
00700
00800 GEOMED - A GEOMETRIC EDITOR.
00900
01000
01100 Bruce g. Baumgart
01200
01300
01400 ABSTRACT:
01500
01600 GEOMED is for making and editing polyhedra and so may be
01700 characterized as a 3D drawing program.
02000
02100 CONTENTS
02200
02300
02400 INTRODUCTION.
02500
02600 POLYHEDRONS.
02700
02800 COMMANDS.
02900
03000 REPRESENTATIONS.
03100
03200 EXAMPLES.
03300
03400 APPENDICES.
00100 INTRODUCTION - 1971 of GEOMED-II.
00200
00300 GEOMED itself is for making and editing polyhedra. However
00400 the larger goal I had in mind when undertaking GEOMED was to achieve
00500 a means of entering 3D data into the computer to form a World Model,
00600 so that a synthetic image could be generated to be compared,
00700 contrasted and correlated with real images.
00800
00900 GEOMED can now do about all that I need from it for the
01000 moment, the demands of the larger goal now seem to lie in comparing,
01100 contrasting and correlating images as well as projecting 2D blobs
01200 into 3D bodies, solving for camera locations and orientations and
01300 pushing the cart hardware around.
01400
01500 A binary dump copy of GEOMED can be started by typing R
01600 GEOMED at a III display. The source files of GEOMED are filed under
01700 the pppn [GEO,BGB] and may either be on the DSK or on the cart
01800 project UDP. The GEOMED of 1971 was written in SAIL and did use
01900 SAIL's associative data structure facility, LEAP.
02000
02100
02200 INTRODUCTION - 1972 of GEOMED-IV.
02300
02400 GEOMED has been rewritten twice again now, the third version
02500 involved getting GEOMED's models out of LEAP and into the "Winged
02600 Edged" data structure that was orginally developed for the hidden
02700 line eliminator, OCCULT. The fourth version was started as a
02800 conversion to NEW SAIL, but the pain of being a guinea pig to frequent
02900 and poorly thought out compiler changes coercised me to convert GEOMED
03000 into the PDP-10's machine code, using the FAIL assembler.
03100
03200
03300
03400 Abbreviations
03500 wrt with respect to
03600 pdl push down list
03700 ccw counter clockwise
03800 cw clockwise
03900 α control key
04000 β meta key
04100 ε meta control keys
00100 POLYHEDRONA & THE SCHLEGEL DIAGRAM.
00200
00300 "Leonardo da Vinci made skeletal models of polyhedra, using
00400 strips of wood for their edges and leaving the faces to be imagined.
00500 When such a model is seen in perspective from a position just outside
00600 the center of one face, this face appears as a large polygon with all
00700 the remaining faces filling its interior. Such a drawing of the
00800 solid is called a Schlegel Diagram."
00900
01000 "The Schlegel diagram for a polyhedron shows at a glance
01100 which vertices belong to which edges and faces. Each face appears as
01200 a region bounded by edges, except the `initial' face, which encloses
01300 all the others. To ensure a one-to-one correspondence between faces
01400 and regions we merely have to associate the initial face with the
01500 infinite exterior region."
01600
01700 - page 152, Coxeter's Geometry.
00100 POLYHEDRA - THE EULER EQUATION.
00200
00300 "Any polyhedron that can be represented by a Schlegel diagram
00400 is said to be `simply connected' or `Eulerian', because its numerical
00500 properties satisfy Euler's formula:
00600
00700 F - E + V = 2
00800
00900 which is valid not only for the Schlegel diagram of such a
01000 polyhedron, but for any connected `map' formed by a finite number of
01100 points and line segments decomposing a plane into non-overlapping
01200 regions: the only restriction is that there must be at least one
01300 vertex.
01400
01500 "A proof resembling Euler's may be expressed as follows. Any
01600 connected map can be built up, edge by edge, from the primitive map
01700 that consists of a single isolated vertex. At each stage, the new
01800 edge either joins an old vertex to a new vertex, or joins two old
01900 vertices. In the former case, V and E are each increased by 1 while F
02000 is unchanged; in the latter, V is unchanged while E and F are each
02100 increased by 1. In either case, the combination F-E+V is unchanged.
02200 At the beginning, when there is only one vertex and one region
02300 (namely, all the rest of the plane), we have
02400
02500 F - E + V = 1 - 0 + 1 = 2.
02600
02700 "This value 2 is maintained throughout the whole construction.
02800 Thus, Euler's formula holds for every plane map. In particular, it
02900 holds for every Schlegel diagram, and so for every simply connected
03000 polyhedron."
03100
03200 - page 152, Coxeter's Geometry.
03300
03400
03500
03600 Euler's formula can be extended for polyhedra that are allowed to
03700 have Holes or Handles:
03800
03900 F - E + V = 2 - 2*H
04000
04100 GEOMED commands preserve the above formula, so consequently all
04200 GEOMED polyhedrons are Topologically Eulerian.
00100 COMMANDS.
00200
00300
00400 GEOMED is invoked by single character commands. Commands that
00500 require arguments refer to the topmost positions of a scratch pad
00600 pushdown list. The commands fall into five major groups:
00700
00800
00900 GROUP - 1.
01000 The Four Primitive Topology Commands.
01100 V - Vertex Body Creation.
01200 E - Edge and Vertex Creation.
01300 J - Join two old vertices forming a new edge and face.
01400 G - Glue two faces together.
01500
01600
01700 GROUP - 2.
01800 Compound Topology Commands.
01900 K - Delete.
02000 S - Sweep.
02100 M - Midpoint of an edge creation.
02200 αR - Rotational solid completion.
02300
02400
02500 GROUP - 3.
02600 Geometric Commands.
02700 Translation.
02800 Rotation.
02900 Dilation.
03000 Reflection.
03100 ...on 3 axes: x, y, and z;
03200 ...in 2 directions + or -, ccw or cw, more or less;
03300 ...wrt a frame of reference: World Frame, Body Frame, Relative Frame.
03400 ...wrt a strength of transformation, 1 foot, 20 degrees, 16 percent.
03500
03600
03700 GROUP - 4.
03800 The Scratch Pad PDL Commands.
03900 push, pop, swap, get, and so on.
04000
04100
04200 GROUP - 5.
04300 The Input, Output and Display Commands.
00100 COMMANDS - GROUP 1.
00200
00300 THE FOUR PRIMITIVE TOPOLOGY COMMANDS.
00400
00500
00600 V - VERTEX BODY CREATION.
00700
00800 This command creates a polyhedron consisting of one vertex
00900 and one face. The vertex is placed at the world origin. Every
01000 polyhedron is derived from a Vertex Body. The terms "body" and
01100 "polyhedron" are equivalent in GEOMED.
01200 The V command takes no arguments and leaves the new body,
01300 face and vertex on the stack with the vertex on top.
01400
01500
01600 E - EDGE AND VERTEX CREATION.
01700
01800 This command creates a new edge and a new vertex starting
01900 from an old vertex. The E command requires two arguments, the top
02000 argument is the old vertex and the second argument must be one of the
02100 faces to which the vertex belongs. The new edge and vertex become
02200 associated with the given face.
02300 The E command, increments the NCNT, which is mentioned
02400 elsewhere, and is used to form solids of rotation.
02500
02600
02700 J - JOIN OLD VERTICES - FACE AND EDGE CREATION.
02800
02900 This command creates a new face and a new edge. The J
03000 command has two forms. The general form of the J command expects two
03100 vertices of the same face to be given on the top of the pdl, and it
03200 returns in their place a new edge and a new face with the edge on
03300 top.
03400 The wire form of the J command applies only to a face that
03500 doesn't have a closed perimeter, which in fact approximates a wire
03600 with two ends free. In this case the top argument is a Vertex End of
03700 the wire and the second argument is the Face of the wire. The wire J
03800 command returns the other end of the wire in top and leaves the
03900 second argument unchanged. The J command clears the NCNT.
04000
04100
04200 G - GLUE TWO FACES TOGETHER.
04300
04400 This command takes two faces from the top of the pdl. The
04500 faces must be nearly coincidant and of opposite orientation. The two
04600 faces are deleted along with all the edges and vertices of one of
04700 them. If there were two bodies, then one remains. A body glued to
04800 itself forms either a hole or a handle. When the glue drys, the
04900 resulting body is returned.
00100 COMMANDS - GROUP 2.
00200
00300 COMPOUND TOPOLOGY COMMANDS.
00400
00500
00600 D - DELETE.
00700
00800 This command takes the top body, face, edge or vertex and
00900 deletes all parts of the body to which it belongs. The camera body
01000 and NIL will not be deleted.
01100
01200
01300 S - SWEEP.
01400
01500 This command sweeps a face into either a sheet or a solid
01600 depending on the NCNT. If the NCNT is zero, then SWEEP returns a new
01700 face coincident with the given face and connected to it by new sweep
01800 edges and rectangular sweep faces forming a prism. Furthermore, a β
01900 sweep forms a pyramid on the given face and returns the peak vertex,
02000 while α sweep and ε sweep form antiprisms. An antiprism is merely a
02100 prism with the rectangular sweep faces split into triangles.
02200 When the NCNT is non-zero, only the first NCNT edges of the
02300 argument face's perimeter are swept into new faces. Thus NCNT new
02400 faces are created and the argument face is returned somewhat more
02500 complicated than before. See the SPHERE example to clarify sweeping
02600 out a solid of rotation.
02800
02900
03000 R - Rotational Solid Completion.
03100
03200 After a wire has been swept around, you have a shell of
03300 rotation. To change a shell into a solid all that remains to be done
03400 is do a series of J commands on the leading and lagging vertices of
03500 the shell. The R command, using the NCNT to step around the pole
03600 caps, calls the J-command for all the necessary pairs. The sweep face
03700 is taken as an argument and nothing is returned.
03800
03900
04000 M - MIDPOINT.
04100
04200 This command takes an edge argument and creating a new edge
04300 and a new vertex makes the appropriate modifications to the body and
04400 returns a the midpoint vertex of the given edge.
00100 COMMANDS - GROUP 3.
00200
00300 HOMEOMORPHIC COMMANDS.
00400
00500 "The criterion that distinguishes one geometry from another
00600 is the group of transformations under which the propositions
00700 remain true." - Klein's Erlangen Program, 1872.
00800
00900 The Euclidean Transformations are Translation, Rotation, Reflection
01000 and Dilation. Homeomorphic is Greek for "same form", and refers to
01100 the so called "rubber sheet" transformations that do not change the
01200 topology of faces, edges and vertices. The Top of the scratch pad pdl
01300 is transformed by hitting one of the following Euclidean Transform
01400 characters:
01500
01600 : Transform in the positive direction wrt the X-axis.
01700 ; Transform in the negative direction wrt the X-axis.
01800 ) Transform in the positive direction wrt the Y-axis.
01900 ( Transform in the negative direction wrt the Y-axis.
02000 * Transform in the positive direction wrt the Z-axis.
02100 - Transform in the negative direction wrt the Z-axis.
02200
02300 Clearly these characters are not mnemonics, they were chosen because
02400 they do not require the TOP key and are conveniently grouped in pairs
02500 under one's right hand.
02600
02700 The Transform is selected by keying the control bits or or prefixing
02800 the command with a control key character of suffering a preselected
02900 default Transform:
03000
03100 default - usually TRANSLATION.
03200 α ROTATION.
03300 β DILATION.
03400 ε REFLECTION.
03500
03600
03700 The Euclidean Transformation default selection characters are:
03800
03900 ! TRANSLATION.
04000 @ ROTATION.
04100 = DILATION.
04200 ∃ REFLECTION.
00100 COMMANDS - GROUP 3 - continued.
00200
00300 Euclidean Transformations.
00400
00500 Translation moves the Top object in the direction specified
00600 by one unit of translation strength. Similairly Rotation rotates the
00700 Top object about the axis specified by one unit of rotational strength.
00800 Positive Rotations are ccw and negative rotations are cw.
00900
01000 Dilations refer to a three state dilation axis selector.
01100 Dilation state 1 causes dilation on the specified axis, dilation
01200 state 2 causes dilation on the two axes not indicated, and dilation
01300 state 3 causes dilation on all the axis indicated. The dilation
01400 selector is advanced by typing the letter A, Advance Axis Selector.
01500 The state of the dilation axis selector is displayed as a digit 1, 2
01600 or 3 just to the right of the dilation strength's per cent sign in
01700 the editor status display at the upper right of the III screen.
01800
01900 And finally, Reflections act only on the axis specified and
02000 always in the world frae of reference. I have found little use for
02100 reflections and consquently their power has atrophied.
00100 COMMANDS - GROUP 3 - continued.
00200
00300 Frames of Reference
00400
00500
00600 The Frame of Reference of the Euclidean Transformations
00700 is determined by the FRAME switch.
00800 FRAME 0 is the world frame.
00900 FRAME 1 is the body frame.
01000 FRAME 2 is the relative frame.
01100 The Frame switch is incremented modulo 3 by the F-command.
01200
01300 The body frame of a body is its datum.
01400
01500 The body frame of a face is a frame of reference with a
01600 z-axis thru the center of mass of the face and pointing out the
01700 exterior side of the face normal to the plane of the face.
01800
01900 The body frame of a face is computed by placing an origin at
02000 the face's average vertex (a pseudo center of mass), and by extending
02100 the i-unit-vector from the origin towards the first vertex of the
02200 face's perimeter list, the k-unit-vector is normal to the plane of
02300 the face, as determined by the first three points of the perimeter
02400 list, and points outwards from the face's exterior side. The
02500 j-unit-vector is the k-unit-vector crossed into
02600 the i-unit-vector for right handedness.
02700
02800 The body frame of an edge or vertex is taken from the body to
02900 which it belongs.
03000
03100 Transformation in the Relative frame of reference transform
03200 the Top object wrt to body frame of reference of the second object on
03300 the PADPDL. If the second object doesn't exist or isn't a body then
03400 the world frame is used.
00100 COMMANDS - GROUP 3 - continued.
00200
00300 Strength of Transformation
00400
00500 The strength of a Euclidean Transformation can be halved or
00600 doubled by keying the Transform's control bits and by striking
00700 a left or right square bracket respectively.
00800
00900 / Halve a Transformation Strength.
01000 \ Double a Transformation Strength.
01100
01200 The strength of a Euclidean Transformation can be set by keying the
01300 Transform's control bits and by striking a digit from 0 to 9.
01400
01500 For Translation:
01600 0 1/16 of a foot, A "binary inch".
01700 4 One Foot.
01800 9 32 Feet.
01900 N Where 0 ≤ N ≤ 9 yield 2.0↑(N-4) feet,
02000 but you only need to memorize the 0,4,9 in
02100 order to keep your head straight.
02200 For Rotation:
02300 9 π/2
02400 8 π/4
02500 etc
02600 For Dilation:
02700 0 100%
02800 1 10%
02900 2 20%
03000 etc
03100 9 90%
00100 COMMANDS - GROUP 3 - continued.
00200
00300 Setting the Strengths
00400
00500 The strengths of the Euclidean Transformations can be entered
00600 numerically by typing λ,π or % followed by a numerical argument. In
00700 command formats given below x & y are scanned as real numbers, while
00800 n, m, d & s are scanned as integers. Integers can be typed in place
00900 of reals with no ill affect, whereas reals typed for integers are
01000 Fixed.
01100
01200 For Translation:
01300 λx feet. Initially set to 1 foot.
01400 λx' feet.
01500 λx'y" feet and inches.
01600 λy" inches.
01700 For Rotation:
01800 π/m pi fraction. Initially set to π/4.
01900 πn/m pi fraction.
02000 πx radians.
02100 πd,m,s degrees, minutes, seconds of arc.
02200 For Dilation:
02300 %x 0.01 ≤ x ≤ 100.00. Divisions by zero are shunned.
02400 Initial set to 75%
02500
00100 COMMANDS - GROUP 4.
00200
00300 THE SCRATCH PAD PDL COMMANDS.
00400
00500 All GEOMED commands that require arguments refer to the top
00600 elements of an itemvar pushdown stack. The stack is displayed on the
00700 leftside of the III screen. The first element on the stack is called
00800 "TOP" or "ARG1", the second element will be called "ARG2", and the
00900 third element "ARG3".
01000
01100 ↑ POP the scratch pad pdl.
01200 ↓ PUSH the TOP of the scratch pad pdl onto the scratch pad pdl.
01300
01400 ↔ SWAP the TOP and ARG2.
01500 , SWAP TOP and ARG3.
01600 ~(tilde)SWAP ARG2 and ARG3.
01700
01800 . PUSH the camera body item onto the scratch pad pdl.
01900
02000 ⊗link Retrieve the Values of the link. Namely the set link⊗TOP is
02100 pushed onto the stack.
02200 `link Retrieve the Objects of the link. Namely the set link`TOP is
02300 pushed onto the stack.
02400
02500 → Cdr a perimeter list. To look at a perimeter of a face, get
02600 the face on the top of the stack and push it, then cdr along.
02700 ← UnCdr a perimeter list.
02800
02900 α↑ POP and then keep popping until a Body is on top
03000 or the stack becomes empty.
03100 β↑ Clear the stack.
03200
03300 Nstr Name the top body by the string str.
03400 Wstr Push the body named string str on the PADPDL.
03500 Wn Get the body, item numbered n.
03600 ? List all the bodies.
00100 COMMANDS - GROUP 5.
00200
00300 INPUT, OUTPUT AND DISPLAY COMMANDS.
00400
00500 O Output the top body of the PADPDL into a B3D file.
00600 I Input a B3D file to the PADPDL.
00700 P Output a PLT file of the current display.
00800
00900 GEOMED will ask the user for file names when they are needed.
01000 On B3D output if you wish to make a file of several bodies then you
01100 do not close the output when you are given the chance.
01200
01300 PLT Files can be plotted on the CALCOMP by running PLTVEC and
01400 answering it self explanatory questions.
01500
01600
01700 CO Camera location, orientation, focal and raster constants Output.
01800 CI Camera location, orientation, focal and raster constants Input.
01900 CP Camera focal and raster constants printed on the TTY.
02000
02100
02200 MODIFICATION OF CAMERA PARAMETERS
02300
02400 GEOMED's camera model is parameterized by three integers and
02500 three real numbers called respectively LDX, LDY, LDZ, PDX, PDY, and
02600 FOCAL. LDX and LDY are the logical raster half size and are
02700 initially 144 by 108, and represent half the number of rows and
02800 columns in the image. PDX and PDY are the physical raster half size,
02900 which is initially 5.3 by 4 millimeters and FOCAL is the focal length
03000 of the camera model and is initially 12.5 millimeters which
03100 corresponds to the wide angle lens that is on the cart. LDZ happens
03200 to always be 1000 and is inaccessibe to users.
03300
03400 αX LDX βX PDX
03500 αY LDY βY PDY
03600
03700 αF FOCAL
00100 INPUT-OUTPUT OF GEOMED COMMAND LANGUAGE EXTERNAL FILES
00200
00300 ⊂ - LEFT HORSE SHOE, OPEN COMMAND FILE.
00400 ⊃ - RIGHT HORSE SHOE, CLOSE COMMAND FILE.
00500 X - EXECUTE EXTERNAL COMMAND FILE.
00600
00700 The Examples at the end of this write up are in the FILE.GEO
00800 external command format. GEO files are written in ASCII mode 0, with
00900 or without line numbers. Lines without tabs are ignored and are
01000 presumed to be commentary. In a line with tabs all characters before
01100 the first tab are presumed to be sequence numbers or tags, all
01200 characters between the first tab and the second tab or end of line
01300 are executed as GEOMED commands. All characters beyond the second
01400 tab are presumed to be commentary. Thus the line format is:
01500
01600 TAG Operations Comment
01700 TAG Operations Comment
01800 TAG Operations Comment
01900 TAG Operations Comment
02000
02100
02200 For what it may be worth, the GEO file format is clearly a
02300 representation for polyhedrons and scenes of polyhedrons. At one time
02400 I considered it very significant that GEOMED commands were so utterly
02500 concise as compared to B3D files for the same object, and I had hoped
02600 that my robot could have a large dictionery of objects which would
02700 only be expanded into B3D when such an object was expected to be in
02800 view.
00100 COMMANDS - GROUP 5.
00200
00300 Editor Status Display
00400
00500 _ flip FLAGV, Display markings on the TOP object.
00600 All the vertices of the top object are marked with asterisks
00700 and if the object is a face the edges are marked by a perimeter
00800 serial number.
00900
01000 ∂ flip FLAGD, Display the datum of the TOP object.
01100
01200 ≡ flip FLAGED, Suppress the Editor Status Display.
01300
01400 ≠ flip FLAGRS, Suppress the main display refresh.
01500
01600 # output a screen full of carriage return line feeds.
01700
01800 L flip Label mode flag.
01900
00100 COMMANDS - GROUP 5.
00200
00300 Koloring and Fotometry.
00400
00500 K - KOLOR COMMAND.
00600
00700 The color command sets the parameters named RED, GREEN, BLUE,
00800 ALBEDO, SPECUL and LUMEN of a face datum. These six parameters are
00900 presently packed into a single word of six bytes and assume values
01000 between 0 and 100 (well really 0 to 63). The Kolor command takes a
01100 string argument which is an arbitrarily ordered concatenation of
01200 color words, where a color word begins with the initial letter of one
01300 of the six parameters (R, G, B, A, S, or L) followed by one or two
01400 digits. Thus: KOLORING ← G40 B60 would tend to give things a
01500 Turquoise appearance when Video Synthesized.
01600 Koloring can be applied to both faces and bodies, naturaly in the
01700 later case all the faces of that body are colored.
01800
01900 The approximate meanings of the Kolor and Fotometry coefficients are:
02000 RED - percent of intensity seen thru a red filter.
02100 GREEN - percent of intensity seen thru a green filter.
02200 BLUE - percent of intensity seen thru a blue filter.
02300 ALBEDO - equivalent to reflectance, per cent of light
02400 power out wrt light power into a face.
02500 SPECUL - per cent of "metalic-look", zero specul is
02600 diffuse Lambert law's cosine light scattering,
02700 100% specul will mirror the light source
02800 angle of incidence is equal to the angle of
02900 reflection law light scattering.
03000 LUMEN - per cent of "glows-in-the-dark", GEO bodies
03100 can not be light sources wrt to each other
03200 but a little luminousity models the appearance
03300 of an Ambient light level and diminishes that
03400 high-contrast 2001 deep-space look.
00100 TVCUT and TVHIDE
00200
00300 In order to generate a sixbit synthetic Television picture in
00400 the so called "Pingle" or ".DAT" or "Ten Word Header" format, Output
00500 the bodies you want, and the desired camera; then type "RU
00600 TVCUT[GEO,BGB]" and answer the easy questions having to do with file
00700 names; then type "RU TVHIDE[GEO,BGB]" and again give file names when
00800 asked. TVHIDE also may ask for other parameters, type zeroes to get
00900 default values.
00100 GEOMED'S POLYHEDRON REPRESENTATION
00200 Polyhedrons in LEAP
00300
00400 Bodies, Faces, Edges and Vertices are represented by items.
00500 In GEOMED only Bodies and Vertices have datums. The datum of a
00600 vertex is a real array [1:3] containing the x, y, and z coordinates
00700 of that vertex in feet wrt an arbitrary frame of reference called the
00800 World Frame.
00900
01000 The datum of a body is a real array [1:4,1:3] of which the fourth row
01100 is the locus of the body in world coordinates. The first three rows
01200 of the body datum contain the components of the i, j, and k unit
01300 vectors which determine the orientation of the body.
01400
01500 Body items are linked to Face, Edge, and Vertex items by Linking
01600 Items named BF, BE, and BV respectively:
01700
01800 BF⊗body≡face
01900 BE⊗body≡edge
02000 BV⊗body≡vertex
02100
02200 Face items are linked to Edge and Vertex items by linking items named
02300 FE and FV respectively:
02400
02500 FE⊗face≡edge
02600 FV⊗face≡vertex
02700
02800 Edge items are linked to Vertex items by a linking item named EV:
02900
03000 EV⊗edge≡vertex
03100
03200 Furthermore, Face items themselves are used to link edges and
03300 vertices in ccw order as seen from the exterior side of the face.
03400 The faces of solid bodies have two sides, an exterior side and an
03500 interior side. The canonical form of the perimeter list of a
03600 triangular face would include the following associations:
03700
03800 face⊗face≡vertex1,
03900 face⊗vertex1≡edge1
04000 face⊗edge1≡vertex2
04100 face⊗vertex2≡edge2
04200 face⊗edge2≡vertex3
04300 face⊗vertex3≡NIL
04400
04500 NIL is merely an item used to terminate perimeter lists.
04600
04700 GEOMED's linking items happened to come out going in the same
04800 direction as Hand Eye's linking items, namely from larger things to
04900 smaller. The correspondence is as follows:
05000 BF for FACE FE for BOUNDARY
05100 BE for LINE FV for CORNER
05200 BV for POINT EV for ENDPT
00100 GEOMED'S POLYHEDRON FILE FORMAT
00200
00300 B3D, Bodies in 3D, formated files are the primary product of
00400 the Geometric Editor.
00500
00600 A B3D file is written in binary mode and is composed of an
00700 arbitrary number of body blocks terminated by a zero word or an EOF
00800 condition. A body block is composed of a Body Header, a Table of
00900 Vertices, a Table of Edges and a Table of Face Perimeter Lists.
01000
01100 The Body Header must have at least three words. The first
01200 word must contain the Vertex Count, the second word must contain the
01300 Edge Count. Further words are optional for Input to GEOMED. GEOMED
01400 outputs The last 12 words contain the Body's Datum.
01500
01600 The Table of Vertices is made up of 3-word blocks containing
01700 the x, y, and z World Coordinates of each vertex of the body. The
01800 Table of Edges has 1-word per edge. Each half of an edge word
01900 contains a non-zero positive integer which is the number of a vertex
02000 in the vertex table.
02100
02200 The Table of Face perimeter lists consists of variable length
02300 blocks of Perimeter Words which are prefixed by a zero word. Each
02400 Perimeter Word contains two non-zero positive integers which
02500 represent a Vertex Table Number and an Edge Table Number and are
02600 stored in the left and right halves respectively. As mentioned
02700 above, the end of the body block, which is also the end of the Table
02800 of Face Perimeter Lists, is marked by a -1 word.
00100 SUMMARY OF THE B3D FILE FORMAT
00200
00300 begin "body block"
00400 α BODY HEADER - The minimal body header consists of XWD -1,3 ↔ M ↔ N;
00500 XWD -1,WRDCNT; α BODY DELIMITER, WRDCNT = NUMBER OF WORDS IN THE HEADER;
00600 INTEGER M; α NUMBER OF VERTICES IN THIS BODY;
00700 INTEGER N; α NUMBER OF EDGES IN THIS BODY;
00800 SIXBIT BNAME; α NAME OF THE BODY OR ZERO;
00900 REAL RADIUS; α MAXIMUM DISTANCE BETWEEN A VERTEX AND THE BODY'S ORIGIN;
01000 REAL ARRAY BDATUM[1:4,1:3]; α THE BODY'S DATUM - ORIENTATION/LOCATION MATRIX;
01100
01200 α TABLE OF VERTICES;
01300 REAL X1,Y1,Z1;
01400 REAL X2,Y2,Z2;
01500 etc.
01600 REAL Xm,Ym,Zm;
01700
01800 α TABLE OF EDGES;
01900 XWD I1,J1; α I's & J's are vertex table indices;
02000 XWD I2,J2;
02100 etc.
02200 XWD In,Jn;
02300
02400 α TABLE OF FACES;
02500 begin "face block"
02600
02700 α face header - the minimal face header consists of XWD -2,1;
02800 XWD -2,WRDCNT; α FACE DELIMITER, WRDCNT = NUMBER OF WORDS IN FACE HEADER;
02900 BYTES Q; α Reflectance [0-8], Specular Coef [9-17], Radiance [18-35];
03000 α face contents;
03100 XWD V1,E1; α Perimeter List of Vertex and Edge pointers in ccw order;
03200 XWD V2,E2;
03300 etc.
03400 XWD Vp,Ep;
03500 end "face block"
03600 until an XWD -1, or XWD -2 shows up.
03700 end "body block"
03800 until a 0 or an EOF shows up.
03900
04000 α EOF;
04100 0;
00100 EXAMPLES
00200
00300 In the hard cover version of this write up there are
00400 illustrations which go along with the examples. However, since you
00500 are reading the cheap paper back version, you will have to key the
00600 examples into the machine at a III display console in order to see
00700 the illustrations.
00800
00900 A CUBE
01000
01100 1. V_ Vertex body creation and "MARKED" display mode.
01200 2. :) positions the vertex in the first quadrant.
01300 3. \ doubles strength of translation.
01400 4. E; make an edge and vertex and move left.
01500 5. E( edge vertex down.
01600 6. E: edge vertex right.
01700 7. J↑ connect the first and last vertices of the wire
01800 forming a new edge and a new face, you now
01900 have a square lamina.
02000 8. / halves the strength of translation.
02100 9. - pushes the face lamina away from you.
02200 10. S sweeps the square face into a very thin solid.
02300 11. **↑ moves the new face towards you.
02400
02500 ANOTHER CUBE
02600
02700 1. V_ Vertex body creation and "MARKED" display mode.
02800 2. :) positions the vertex in the first quadrant.
02900 3. \ doubles strength of translation.
03000 4. E; make an edge and vertex and move left.
03100 5. ↑S( get the wire face on top and sweep it into a lamina.
03200 6. J clear the NCNT.
03300 7. /*\ position the lamina face in the z direction.
03400 8. S-↑ sweep the lamina into a solid and pop it off.
03500
03600 A TETRAHEDRON (not regular)
03700
03800 1. V:π2/3 Position a vertex.
03900 2. @E*E*J!↑ Make a triangular base.
04000 3. β S*↑ Sweep out a pyramid from the base.
04100
04200 A REGULAR OCTAHEDRON
04300
04400 1. V:) Position a vertex.
04500 2. \E;E(E:J Make a square lamina.
04600 3. ↑↑⊗BF Get the faces of the lamina.
04700 4. λ1.414212 Enter the square root of two.
04800 5. β S -↑ Sweep out two pyramids.
04900 β S *↑
00100 EXAMPLES - continued.
00200
00300 A REGULAR ICOSAHEDRON
00400 1. V\\:
00500 2. π2/5
00600 3. @E*E*E*E*J!
00700 4. ↑↑⊗BF
00800 5. α 9 α ; π/5
00900 6. λ1.4
01000 7. ( α S )) α (
01100 8. β S λ2.4
01200 9. )↑ β S(
01300
01400 A SPHERE
01500 1. V\\( Position a vertex to the south pole.
01600 2. @6*\ Move it north to the antarctic circle.
01700 3. E*E*E*E* Sweep out a meridian wire.
01800 E*E*E*↑
01900 4. S(S(S(S( Form the globe by sweeping the first meridian
02000 S(S(S(S( about the Y-axis.
02100 S(S(S(S(
02200 S(S(S(
02300 5. R↑ Seal up the sweep face forming pole cap faces
02400 and converting a spherical sheet into a solid.
02500
02600 A TORUS
00100 A DODECAHEDRON
00200 1. \\v/:)-\E;E(E:J↑S*↑
00300 Like in Euclid's construction,
00400 (Elements, Book XIII, proposition 17)
00500 we start with a cube.
00600 2. ⊗BE Make Midpoints on the twelve edges.
00700 M↑M↑M↑M↑
00800 M↑M↑M↑M↑
00900 M↑M↑M↑M↑
01000 3. λ0.191 The edges of the cube are
01100 \\ diagonals in the faces of the
01200 duodecahedron. The 0.191 as well
01300 as the 0.308 below are derived
01400 by alittle trigonometry on the sly.
01500 4. ⊗BV Position the midpoints on their faces.
01600 (↑ *↑ )↑ *↑
01700 ;↑ :↑ (↑ :↑
01800 -↑ ;↑ )↑ -↑
01900 5. α ↑ Flush the other points.
02000 6. λ0.308 Another magic constant.
02100 \\
02200 7. ⊗BV Position the midpoints above their faces.
02300 -↑ ;↑ -↑ :↑
02400 )↑ )↑ *↑ (↑
02500 ;↑ (↑ *↑ :↑
00500 TETRAHEDRON
00600
00800
00900 SOMA BLOCKS
01000 the step: V![:)-]E;E(E:J↑S*↑⊗BFS:↑↑↑S)↑↑↑
01100 the el: V![:)-]E;E(E:J↑S*↑⊗BFS:↑↑S;↑S)↑↑↑
01200 the te: V![:)-]E;E(E:J↑S*↑⊗BFS:↑↑↑S)↑↑S*↑
01300 the zigzag: V![:)-]E;E(E:J↑S*↑⊗BFS:↑↑↑S)⊗FE↑`FES*↑↑↑↑↑↑↑↑
01400 the left hand: V![:)-]E;E(E:J↑S*↑⊗BFS:↑↑↑S)⊗FE↑↑`FES;↑↑↑↑↑↑↑
01500 the right hand: V![:)-]E;E(E:J↑S*↑⊗BFS:↑↑↑S)⊗FE↑↑↑`FES-↑↑↑↑↑↑
01600 the corner stone:
01700 V]>∧E]<`FVS∨JS¬↔↑`BF↔↑[⊃[@[∧>]!
01800 V]>∧E]<`FVS∨JS¬↔↑`BF↔↑[⊃[@[∧>]!]>∧¬]>¬
01900
02000 A KNOT
02100 "J" S@:!:S@:!:S@:!:S@:!:S@:!:S@:!:S)))))),((((((,
02200 "K" S@*!*S@*!*S@*!*S@*!*S@*!*S@*!*S::::::,;;;;;;******,
02300 "L" S@)!)S@)!)S@)!)S@)!)S@)!)S@)!)S******,------,
02400 END;
00100 APPENDIX - THE HOMOGENEOUS HOBGOBLIN.
00200
00300 I wish to justify GEOMED's Euclidean Representation of
00400 vertices. For the benefit of the innocent reader, the orthodox and
00500 academically respectable representation is the Homogeneous
00600 Representation. The Homogeneous Representation was used and
00700 published by Roberts - in an appendix to his Machine Perception
00800 paper.
00900
01000 GEOMED does not use the homogeneous representation because
01100 Rotation, Translation and Perspective Projection require more
01200 execution time and vertices require more memory when homogeneous
01300 coordinates are used in a floating format on conventional computer
01400 hardware such as a PDP-10.
01500
01600 Although Roberts' paper clearly states that the advantage of
01700 the homogeneous representation is for scaling integers, others have
01800 gone forth teaching and implementing the homogeneous representation
01900 in circumstances where the Euclidean representation would have been
02000 more concise and economical.
02100
02200 For me, homogenity really becomes a hobgoblin not when it is
02300 wasting CPU and memory cycles but rather when some one attempts to
02400 convince me that it is more mathematically elegant than the Euclidean
02500 geometry of three space polyhedrons.
00100 APPENDIX - SHORT COMINGS.
00200
00300 GEOMED doesn't have:
00400
00600 Animation.
00700 Space War Buttons.
00800 Light pen or Tablet.
00900 Arcs and Higher Ordered Surfaces.
01000 Compound Bodies.
01100 Advanced Language Features - Macros, Iteration,
01200 Conditional, Command Editing, External
01300 Command Files, and so on.
01400 Conflicting Bodies.
01500 Cuts.
01600 Data Disc Display.
01700 Blunder Recovery.
01800 Extraordinary Speed.
01900 or a completely worked out mathematical formalism.
02000
02100
02200 RESERVE
02300 The iteration notation will be { n | commands }.
00100 SUMMARY OF SWITCHES
00200
00300 switch commentary
00400
00500
00600 Q - FRMORG
00700 FRMORG affects world frame rotations.
00800 TRUE * rotation about a world axis,
00900 thru the world origin.
01000 FALSE rotation about a parallel to a world axis,
01100 thru the body origin.
01200 FRMORG is flipped by the Q-command.
01300 The state of FRMORG is indicated by an asterisked in the
01400 Editor's Status Display. The asterisk is present when
01500 FRMORG is true and absent when FRMORG is false.
01600
01700 F - FRAME
01800 FRAME is a three state switch that affects translation,
01900 rotation and dilation.
02000 state-1 indicates World Frame of Reference.
02100 state-2 indicates Body Frame of Reference.
02200 state-3 indicates Relative Frame of Reference.
02300 FRAME is incremented, modulo 3, by the F-command.
02400
02500 A - AXECNT
02600 AXECNT affects only dilations.
02700 state-1 indicates dilation only on the specified axis.
02800 state-2 indicates dilation on the two axes not specified.
02900 state-3 indicates dilation on all three axes.
03000 The state of dilation is indicated by a digit to the right of
03100 the dilation strength's percent sign in the GEOMED Status Display.
03200 AXECNT is incremented, modulo 3, by the A-command.
03300